<?php

/**
 * Arreglo que contiene las paginas registradas
 * 
 * Formato:
 * 
 * $__arrPaginaRegPags[$strNombreClase]["Registrado"] = 1;
 * $__arrPaginaRegPags[$strNombreClase]["Opciones"  ][] = $varParametro;
 */
$__arrPaginaRegPags  = array();

/**
 * Arreglo que contiene los plugins registrados. Estos plugins seran rendereados
 * a menos que se quiten.
 * 
 * Formato:
 * 
 * $__arrPaginaRegPlugs[$strNombreClase][$strNombrePlugin]["Registrado"] = 1; // o 0 para desactivar
 * $__arrPaginaRegPlugs[$strNombreClase][$strNombrePlugin]["Opciones"  ][] = $varParametro;
 */
$__arrPaginaRegPlugs = array();

/**
 * Variable que indica si existe una clase que maneje por default las paginas, 
 * aunque la opcion no se reconozca.
 * 
 * Dicha clase ya debe estar registrada.
 */
$__strDefaultPageClass = "";

/**
 * Clase que maneja las paginas.
 * 
 * Esta clase es la base para la muestra de paginas
 */
class Pagina {
  /**
   * Variable que contiene el objeto que maneja la pagina rendereada
   * 
   * @var Pagina
   */
  static $__oPaginaRendereada;
  
  /**
   * Funcion que registra las clases que contienen paginas
   * 
   * Esta funcion debe ser llamada con cada una de las clases derivadas para 
   * poder ensamblarlas despues.
   * 
   * Cada clase debe de ya haberse cargado (Esto es, debe estar registrada antes
   * de hacer el llamado a esta funcion)
   * 
   * @param string $strNombreClase    Nombre de la clase que se va a registrar
   * @param array  $arrOpcionesPagina Arreglo con las opciones extra que lleva la pagina (Los plugins se registran aparte)
   */
  static function __RegisterPage($strNombreClase, $arrOpcionesPagina = "") {
    global $__arrPaginaRegPags;
    $__arrPaginaRegPags[$strNombreClase]["Registrado"] = 1;
    $__arrPaginaRegPags[$strNombreClase]["Opciones"  ] = $arrOpcionesPagina;
  }
  
  static function RegisterDefaultPage($strDefaultPage) {
    global $__strDefaultPageClass;
    $__strDefaultPageClass = $strDefaultPage;
  }
  
  /**
   * Funcion que registra los plugins globales que contendrá la página
   * 
   * Esta funcion debe ser llamada con cada uno de los plugins que se van a 
   * cargar en todas las paginas.
   * 
   * Dichos plugins podran ser desactivados por cada pagina adicional.
   * 
   * Cada clase debe de ya haberse cargado (Esto es, debe estar registrada antes
   * de hacer el llamado a esta funcion)
   * 
   * Si el plugin que se registra es "Local" (Esto es, que necesita de un objeto 
   * para poder ser llamado), solo se rendereara si la pagina que maneja esta 
   * vista es de la clase del plugin
   * 
   * @param string $strNombreClase    Nombre de la clase que contiene el plugin
   * @param string $strNombrePlugin   Nombre deñl plugin (Funcion dentro de dicha clase) que se esta registrando
   * @param array  $arrOpcionesPlug   Arreglo con las opciones extra que el plugin
   */
  static function __RegisterPlugin($strNombreClase, $strNombrePlugin, $arrOpcionesPlug = "") {
    global $__arrPaginaRegPlugs;
    $__arrPaginaRegPlugs[$strNombreClase][$strNombrePlugin]["Registrado"] = 1;
    if($arrOpcionesPlug) {
      // Se verifica para no sobreescribir el plugin
      $__arrPaginaRegPlugs[$strNombreClase][$strNombrePlugin]["Opciones"] = $arrOpcionesPlug;
    }
  }
  
  /**
   * Funcion que rendereara la opcion del parametro pasado.
   * 
   * Esta funcion se sobrecarga.
   * 
   * Si la clase no puede renderear dicha opcion, regresara una cadena vacia
   * en release, o un "No puedo renderear" en debug
   * 
   * @param string $strOpcion Opcion que se intentara renderear
   * 
   * @return string Pagina rendereada
   */
  Function DoRenderOption($strOpcion = "") {
    return "";
  }
  
  /**
   * Funcion que "Desregistra" un plugin, para no ser procesado
   * 
   * @param type $strNombreClase  Nombre de la clase en donde se encuentra el plugin
   * @param type $strNombrePlugin Nombre de la funcion que procesa el plugin
   */
  static function UnregisterPlugin($strNombreClase, $strNombrePlugin) {
    global $__arrPaginaRegPlugs;
    $__arrPaginaRegPlugs[$strNombreClase][$strNombrePlugin]["Registrado"] = 0;
  }
  
  /**
   * Funcion que, dependiendo de la opcion, renderea la pagina
   * 
   * @return string Pagina rendereada
   */
  static function DoRenderPage() {
    global $__arrPaginaRegPags   ;
    global $__strDefaultPageClass;
    
    $strPageOption        = Variables::GetPageOption();
    $arrOpcionesManejadas = array();
    $oPaginaManejador     = new Pagina();
    $bolPaginaManejada    = false;
    $strPagina            = "";
    
    foreach($__arrPaginaRegPags as $strClasePagina => $arrOpcionesClasePagina) {
      if($arrOpcionesClasePagina["Registrado"] == "1") {
        eval("\$arrOpcionesManejadas = $strClasePagina::GetOptionArray();");
        if(isset($arrOpcionesManejadas[$strPageOption])) {
          // Esta clase maneja la pagina
          eval("\$oPaginaManejador = new $strClasePagina();");
          $bolPaginaManejada = true;
          $strPagina = $oPaginaManejador->DoRenderOption($strPageOption);
        }
      }
      
      if($bolPaginaManejada) break;
    }
    
    // Si la opcion no es manejada por ninguna pagina, ver si es manejada por la opcion default
    if(!$bolPaginaManejada) {
      if($__strDefaultPageClass) {
        // CODIGO QUE RENDEREA LA PAGINA DEFAULT
      } else {
        $oConfiguracion = new Config();
        $strPagina = "" . str_replace("\\'", "'", $oConfiguracion->Get('mensaje_inicio')) . "";;
      }
    }
    return $strPagina;
  }
  
  static function DoRenderPlugins() {
    
  }
  
  /**
   * Funcion que se sobrecarga para ver que opciones seran manejadas por esta 
   * clase
   * 
   * *** Se sobrecarga ***
   * @return array arreglo de la manera $arr["opcion"] = "Nombre de la pagina";
   */
  static function GetOptionArray() {
    return array();
  }
  
  /**
   * Funcion que obtiene los plugins que esta clase ofrece.
   * 
   * Puede obtener dos tipos de plugins:
   * 
   * 0 => Solo los externos (Los que no necesitan de que este objeto sea creado: 
   * esto es, plugins estaticos)
   * 
   * 1 => Solo los internos (Los que necesitan que este objeto este instanciado)
   * 
   * *** Se sobrecarga ***
   * 
   * @param  int   $intTipo Tipo de plugins que se desea obtener
   * 
   * @return array
   */
  static function GetPluginsArray($intTipo = 0) {
    return array();
  }
}

?>